package com.example.springboot.高级特性;

/**
 * SpringApplication.run(Application.class, args);开始
 * 创建 SpringApplication
 *    ○ 保存一些信息。
 *    ○ 判定当前应用的类型。 是web  还是响应式
 *      ○ bootstrappers：初始启动引导器（List<Bootstrapper>）：
 *        去spring.factories 文件中找
 *        org.springframework.boot.Bootstrapper
 *      ○ 找 ApplicationContextInitializer；
 *        去spring.factories 找 ApplicationContextInitializer
 *       ■ List<ApplicationContextInitializer< ?>> initializers
 *     ○ 找 ApplicationListener  ；应用监听器。
 *       去spring.factories找 ApplicationListener
 *       ■ List<ApplicationListener< ?>> listeners
 *
 * 运行 SpringApplication     run
 *   ○ StopWatch
 *   ○ 记录应用的启动时间
 *   ○ 创建引导上下文（Context环境）createBootstrapContext()
 *     ■ 获取到所有之前的 bootstrappers 挨个执行 intitialize()
 *       来完成对引导启动器上下文环境设置
 *   ○ 让当前应用进入headless模式。 java.awt.headless  自力更生
 *   ○ 获取所有 RunListener（运行监听器）【为了方便所有Listener进行事件感知】
 *     ■ getSpringFactoriesInstances 去spring.factories找
 *       SpringApplicationRunListener.
 *   ○ 遍历 SpringApplicationRunListener 调用 starting 方法；
 *     ■ 相当于通知所有感兴趣系统正在启动过程的人，项目正在 starting。
 *   ○ 保存命令行参数；ApplicationArguments   args
 *   ○ 准备环境 prepareEnvironment（）;
 *     ■ 返回或者创建基础环境信息对象。StandardServletEnvironment
 *     ■ 配置环境信息对象。
 *       ● 读取所有的配置源的配置属性值。
 *     ■ 绑定环境信息
 *     ■ 监听器调用 listener.environmentPrepared()；
 *       通知所有的监听器当前环境准备完成
 *   ○ 创建IOC容器（createApplicationContext（））
 *     ■ 根据项目类型（Servlet）创建容器，
 *     ■ 当前会创建 AnnotationConfigServletWebServerApplicationContext
 *   ○ 准备ApplicationContext IOC容器的基本信息   prepareContext()
 *     ■ 保存环境信息
 *     ■ IOC容器的后置处理流程。
 *     ■ 应用初始化器；applyInitializers；
 *       ● 遍历所有的 ApplicationContextInitializer 。调用 initialize.。
 *         来对ioc容器进行初始化扩展功能
 *       ● 遍历所有的 listener 调用 contextPrepared。
 *        EventPublishRunListenr；通知所有的监听器contextPrepared
 *     ■ 所有的监听器 调用 contextLoaded。通知所有的监听器 contextLoaded；
 *   ○ 刷新IOC容器。refreshContext
 *     ■ 创建容器中的所有组件（Spring注解）
 *   ○ 容器刷新完成后工作？afterRefresh
 *   ○ 所有监听 器 调用 listeners.started(context);
 *     通知所有的监听器 started
 *   ○ 调用所有runners；callRunners()
 *     ■ 获取容器中的 ApplicationRunner
 *     ■ 获取容器中的  CommandLineRunner
 *     ■ 合并所有runner并且按照@Order进行排序
 *     ■ 遍历所有的runner。调用 run 方法
 *   ○ 如果以上有异常，
 *     ■ 调用Listener 的 failed
 *   ○ 调用所有监听器的 running 方法  listeners.running(context);
 *      通知所有的监听器 running
 *   ○ running如果有问题。继续通知 failed 。调用所有 Listener 的 failed；
 *     通知所有的监听器 failed
 *
 *
 * 需要在spring.factories 里的需要创建一个 resources 下META-INF 里加一个
 * spring.factories 的文件 在里面导入
 *
 *
 */
public class springBoot流程 {
}
